/* Function prototypes for all compiler files. */

/*
 * scan.c
 */
int scan(struct token *t);

/*
 * tree.c
 */
struct ASTnode *mkastnode(int op, int type, struct ASTnode *left,
			  struct ASTnode *mid, struct ASTnode *right, int intvalue);
struct ASTnode *mkastleaf(int op, int type, int intvalue);
struct ASTnode *mkastunary(int op, int type, struct ASTnode *left, int intvalue);

/*
 * expr.c
 */
struct ASTnode *binexpr(int ptp);

/*
 * interp.c
 */
int interpretAST(struct ASTnode *node);

/*
 * gen.c
 */
int genAST(struct ASTnode *node, int reg, int parent_ast_op, int label);
void genpreamble(void);
void genfreeregs(void);
void genprintint(int reg);
void genglobsym(int id);

/*
 * cg.c
 */
void freeall_registers(void);
void cgpreamble(void);
void cgfuncpreamble(char *name);
void cgfuncpostamble(void);
int cgloadint(int value);
int cgloadglob(int id);
int cgadd(int r1, int r2);
int cgsub(int r1, int r2);
int cgmul(int r1, int r2);
int cgdiv(int r1, int r2);
void cgprintint(int r);
int cgstorglob(int r, int id);
void cgglobsym(int id);
int cgcompare_and_set(int ASTop, int r1, int r2);
int cgcompare_and_jump(int ASTop, int r1, int r2, int label);
void cgjump(int label);
void cglabel(int label);
int cgwiden(int r, int old_type, int new_type);

/*
 * stmt.c
 */
struct ASTnode *compound_statement(void);

/*
 * misc.c
 */
void match(int tk, char *expected_str);
void semi(void);
void ident(void);
void lbrace(void);
void rbrace(void);
void lparen(void);
void rparen(void);
void fatal(char *s);
void fatals(char *s1, char *s2);
void fatald(char *s, int d);
void fatalc(char *s, int c);

/*
 * sym.c
 */
int findglob(char *sym);
int addglob(char *name, int type, int stype);

/*
 * decl.c
 */
void var_declaration(void);
struct ASTnode *function_declaration(void);

/*
 * types.c
 */
int type_compatible(int *left_type, int *right_type, int onlyright);
